#include"thread.hpp"
#include<iostream>
#include<vector>
using namespace Thread;
#define NUM 4
#define NUM 4


class ThreadData
{
    public:
    ThreadData()
    {
        
    }
    ThreadData(ThreadData& tmp)
    {
         _name = tmp._name;
        lock_ptr=tmp.lock_ptr;
    }
    ThreadData operator=(ThreadData tmp)
    {
        _name = tmp._name;
        lock_ptr=tmp.lock_ptr;
        return *this;
    }



    std::string _name;
    pthread_mutex_t* lock_ptr;
};
int ticketnum=1000;
void Ticket(ThreadData& td)
{
    while(true)
    {
        pthread_mutex_lock(td.lock_ptr);
        if(ticketnum>0)
        {
            usleep(1000);
            printf("get a new ticket, who get it: %s, id: %d\n", td._name.c_str(), ticketnum--);
            pthread_mutex_unlock(td.lock_ptr);
            
        }
        else
        {
            pthread_mutex_unlock(td.lock_ptr);
            break;
        }
    }
}
int main()
{
    pthread_mutex_t lock;
    pthread_mutex_init(&lock,nullptr);

    std::vector<myThread<ThreadData>> threads;
    for(int i=0;i<NUM;i++)
    {
        ThreadData* td=new ThreadData();
        td->lock_ptr=&lock;
        threads.emplace_back(Ticket,*td);
        td->_name=threads.back().Name();
    }
    for (auto &thread : threads)
    {
        thread.Start();
    }

    sleep(5);
    // 3. 等待线程
    for (auto &thread : threads)
    {
        thread.Join();
    }

    pthread_mutex_destroy(&lock);
    
}


// int ticketnum=1000;
// void Ticket()
// {
//     while(true)
//     {
//         if(ticketnum>0)
//         {
//             usleep(1000);
//             std::cout<<"the ticke last num"<< ticketnum--<<std::endl;
//         }
//         else
//         {
//             break;
//         }
//     }
// }

// int main()
// {
//     std::vector<myThread> ticket;
//     for(int i=0;i<NUM;i++)
//     {
//         ticket.emplace_back(Ticket);
//     }
//     for(auto& e: ticket)
//     {
//         e.Start();
//     }
//     for(auto& e :ticket)
//     {
//         e.Join();
//     }
//     return 0;
// }